package com.cmeduSystem.common.flow.util;

import cn.hutool.core.lang.Assert;
import com.alibaba.fastjson.JSONObject;
import com.cmeduSystem.common.flow.base.service.BaseFlowOnlineService;
import com.cmeduSystem.common.flow.model.FlowWorkOrder;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

import java.util.List;
import java.util.Map;

/**
 * 面向在线表单工作流的业务数据扩展帮助实现类。
 *
 * @author xulei
 * @date 2025-09-04
 */
@Slf4j
@Setter
public class BaseOnlineBusinessDataExtHelper {

    private BaseFlowOnlineService onlineBusinessService;

    /**
     * 更新在线表单主表数据的流程状态字段值。
     *
     * @param workOrder 工单对象。
     */
    public void updateFlowStatus(FlowWorkOrder workOrder) {
        Assert.notNull(workOrder.getOnlineTableId());
        if (this.onlineBusinessService != null && workOrder.getBusinessKey() != null) {
            onlineBusinessService.updateFlowStatus(workOrder);
        }
    }

    /**
     * 更新业务表的工单编号字段。
     *
     * @param workOrder 工单对象。
     */
    public void updateWorkOrderCode(FlowWorkOrder workOrder) {
        Assert.notNull(workOrder.getOnlineTableId());
        if (this.onlineBusinessService != null && workOrder.getBusinessKey() != null) {
            onlineBusinessService.updateWorkOrderCode(workOrder);
        }
    }

    /**
     * 根据工单对象级联删除业务数据。
     *
     * @param workOrder 工单对象。
     */
    public void deleteBusinessData(FlowWorkOrder workOrder) {
        Assert.notNull(workOrder.getOnlineTableId());
        if (this.onlineBusinessService != null && workOrder.getBusinessKey() != null) {
            onlineBusinessService.deleteBusinessData(workOrder);
        }
    }

    /**
     * 更新在线表单主表数据的业务数据。
     *
     * @param processInstanceId 流程实例Id。
     * @param businessKey       业务主键Id。
     * @param masterData        主表数据。
     */
    public void updateBusinessData(String processInstanceId, String businessKey, JSONObject masterData) {
        onlineBusinessService.updateBusinessData(processInstanceId, businessKey, masterData);
    }

    /**
     * 获取业务数据。
     * @param processInstanceId 流程实例Id。
     * @param businessKey       业务主键Id。
     * @return JSON格式化后的业务数据。
     */
    public String getBusinessData(String processInstanceId, String businessKey) {
        return onlineBusinessService.getBusinessData(processInstanceId, businessKey);
    }

    /**
     * 执行SQL查询。
     *
     * @param dblinkId 所在数据库链接Id。
     * @param sql      SQL语句。
     * @return 查询结果集。
     */
    public List<Map<String, Object>> executeQuery(Long dblinkId, String sql) {
        return onlineBusinessService.executeQuery(dblinkId, sql);
    }

    /**
     * 执行增删改的SQL。
     *
     * @param dblinkId 所在数据库链接Id。
     * @param sql      SQL语句。
     */
    public void executeSql(Long dblinkId, String sql) {
        onlineBusinessService.executeSql(dblinkId, sql);
    }
}
